//      bugmap.h
//      
//      Copyright 2012 dimir <dimir@dimir-pc>
//      
//      This program is free software; you can redistribute it and/or modify
//      it under the terms of the GNU General Public License as published by
//      the Free Software Foundation; either version 2 of the License, or
//      (at your option) any later version.
//      
//      This program is distributed in the hope that it will be useful,
//      but WITHOUT ANY WARRANTY; without even the implied warranty of
//      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//      GNU General Public License for more details.
//      
//      You should have received a copy of the GNU General Public License
//      along with this program; if not, write to the Free Software
//      Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
//      MA 02110-1301, USA.
//      
//      


#ifndef BUGMAP_H
#define BUGMAP_H

#include <vector>
#include <string>
#include <cstdio>
#include <sstream>
#include <iostream>
#include <vector>
#include <cstring>
#include <cstdlib>

#include "decree.h"
#include "game_errors.h"
class BugMap
{
	public:
		BugMap();
		// true - если карта была нормально считана, 
		// false - если что-то пошло не так
		bool loadMap(const std::string& Map);
		
		// decrees - приказы от игрока номер numberOfPlayer
		// метод обновляет карту
		// 0 - играем дальше, другое значение  - кто-то выиграл, смотри game_errors.h
		u_int update(std::vector<Decree>& decrees, const u_int& numberOfPLayer);
		
		//Метод сохраняет текущую карту в файл Map
		//true - всё ок, false - что-то пошло не так
		bool saveMap(const std::string& Map);
		std::string toString();
		u_int getScorePlayer1();
		u_int getScorePlayer2();	
		friend std::istream& operator >>(std::istream& f, BugMap& arg){
			return f;
		}
		friend std::ostream& operator <<(std::ostream& f, BugMap& arg){
			f << arg.toString();
			f.flush();
			return f;
		}		
	private:
		/* add your private declarations */
		char map[15][15];
		int bugs[15][15];
		u_int scorePlayer1;
		u_int scorePlayer2;
		//После каждого хода необходимо инвертировать количества жуков,
		//так как на первом ходу положительны количества первых жуков,
		//а на втором положительны количества вторых жуков.
		void reverseSide();
		bool Good(char c);
		//Возвращает набор корректных приказов
		std::vector<Decree> checkDecrees(const std::vector<Decree>& decree);
		//Проверяет приказ на корректность по направлению.
		bool checkDirectionOfDecree(const Decree& decree);
		
		//Сражение между группой жуков №1 (a) и №2 (b)
		//true - победила группа №2
		//false - победила группа №1
		bool battle(int& a, int& b);
		//Проверка на то, что кто-то выиграл.
		u_int isPlayerWin(const u_int&);
		
};

#endif /* BUGMAP_H */ 
